
//单例模式代码样例
// ⼀个类只能创建⼀个对象，即单例模式，该设计模式可以保证系统中该类只有⼀个实例，并提供⼀个
// 访问它的全局访问点，该实例被所有程序模块共享。⽐如在某个服务器程序中，该服务器的配置信息
// 存放在⼀个⽂件中，这些配置数据由⼀个单例对象统⼀读取，然后服务进程中的其他对象再通过这个
// 单例对象获取这些配置信息，这种⽅式简化了在复杂环境下的配置管理。

#include <iostream>

//饿汉模式
// 程序启动时就会创建⼀个唯⼀的实例对象。 因为单例对象已经确定， 所以⽐较适⽤于多
// 线程环境中，多线程获取单例对象不需要加锁， 可以有效的避免资源竞争， 提⾼性能。
// class singleton{
//     private:
//         int _data;
//         static singleton _eton;

//         singleton():_data(99){std::cout<<"饿汉模式构造单例对象\n";}
//         singleton(const singleton&)=delete;
//         singleton& operator=(const singleton&)=delete;
//         ~singleton(){}
//     public:
//         static singleton& getInstance(){
//             return _eton;
//         }
//         int getData(){
//             return _data;
//         }
// };
// singleton singleton::_eton;


//懒汉模式--延迟加载的思想
class singleton{
    private:
        int _data;

        singleton():_data(99){std::cout<<"懒汉模式构造单例对象\n";}
        singleton(const singleton&)=delete;
        singleton& operator=(const singleton&)=delete;
        ~singleton(){}
    public:
        static singleton& getInstance(){
            //在c++11之后，这里访问是线程安全的，静态变量只会被构造和析构一次
            static singleton _eton;
            return _eton;
        }
        int getData(){
            return _data;
        }
};

int main()
{
    std::cout<<singleton::getInstance().getData()<<std::endl;
    return 0;
}
